Background


Data Collection

Data Configuration

We have species composition data from 1031 1m^2 quadrats representing 27 sites.

Nearly all statistical packages require the data to be in a presence-absence form. There are several ways to do it (one of which can maintain cover values rather than changing it to binary data); I used a loop function. The result is a presence-absence matrix with Site as a column so subsamples can be organized accordingly. This column must be deleted for every analysis, however!

Table 1. Sample of data in presence-absence format.
Site SCICYP PROPEC JUNDEB JUNREP CXJOOR CXLOUI
1.1.1 1 1 1 1 1 1 0
1.1.2 1 1 1 1 0 0 1
1.1.3 1 1 1 0 0 0 1
1.1.4 1 1 1 0 0 1 1
1.1.5 1 0 0 0 0 0 1

Diversity Estimates

Sites had widely varying observed total richness. The use of extrapolated species accumulation curves can tell us how many species are likely to be at the site based on how many were found in accumulating subsamples. However if a curve never flattens, it gives a wild estimate of richness (see Site 10).

What do the curves that made these estimates look like? Let’s take a look!

This plot is not particularly helpful other than to visualize the general span of observed and expected richnesses and sampling efforts. Examining the curves in portions of 3-4 is necessary to

These curves illustrate not only where the flattening point (expected richness) occurs, but also how quickly. Examining a curve can allow someone to estimate how many more samples would be needed to reach that point, however if doing so samples a larger area then the curve may never flatten.

Let’s see if sampling effort (# quadrats/area sampled) affected percent estimated sampling completion; if it did, that would be a big problem and I would have a lot of explaining to do to my committee.

There is no relationship between sampling effort and completion percentage (p=0.6366006). However, note that Sites 10 and 26 were flagged as outliers by the autoplot function. This inadequate sampling is likely the result of too few quadrats sampled at the wetland edge relative to the size of the wetland.

Effects on Diversity


There appears to be a relationship between site richness and site area, but unexpectedly this relationship appears to be negative. Because the data are likely non-linear, a generalized linear model should be used to assess this relationship.

Community Classification

Which sites are similar?

There may be a lot of overlap in clusters due to the nestedness of some community types. We should revisit this later using quadrats as replicates.

Are sites similar because they’re geographically closer?

ggplot(distance.f, aes(x=distance.f$geographic, y=distance.f$Sorensen)) +
  geom_point()+
  geom_smooth(method="glm", method.args=list(family="binomial"(link="logit")))+
  ylab("Sorensen dissimilarity index")+
  xlab("Geographic distance (m)")+
  ggtitle("Geographic distance between sites has no effect on species similarity")+
  coord_cartesian(ylim = c(0, 1))
non-integer #successes in a binomial glm!

Call:
glm(formula = Sorensen ~ geographic, family = binomial, data = distance.f)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.13785  -0.13608   0.02589   0.19654   0.64852  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) 1.427e+00  1.626e-01   8.777   <2e-16 ***
geographic  6.933e-07  1.764e-06   0.393    0.694    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 43.121  on 701  degrees of freedom
Residual deviance: 42.966  on 700  degrees of freedom
AIC: 298.02

Number of Fisher Scoring iterations: 4

Ordinations

Implications

Plant communities aren’t real. We can all go home now.

LS0tDQp0aXRsZTogIkRldGVybWluaXN0aWMgcHJvY2Vzc2VzIGRyaXZlIHdldGxhbmQgcGxhbnQgY29tbXVuaXR5IGNvbXBvc2l0aW9uIGFuZCBkaXZlcnNpdHkiDQphdXRob3I6ICJDLiBNLiBDaWFmcsOpIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHJvd3MucHJpbnQ6IDEwDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQoNCi0tLQ0KIyAgIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCmBgYHtyIHNldHVwLCBOT1RJQ0UgVVNFIG9mIFBBQ01BTiwgaW5jbHVkZT1GQUxTRX0NCiNpbnN0YWxsIHBhY21hbiBmaXJzdCB0byBhdXRvbWF0aWNhbGx5IGluc3RhbGwgYW5kIGxvYWQgYW55IG5lZWRlZCBwYWNrYWdlcw0KcGFjbWFuOjpwX2xvYWQoZ2dwbG90MiwgZHBseXIsIHRpZHlyLCByZXNoYXBlLCBpTkVYVCwga25pdHIsIGthYmxlRXh0cmEsIGdnZm9ydGlmeSwgZ2dwdWJyLCB2ZWdhbiwgZ2Vvc3BoZXJlLCBtY2x1c3QpDQoNCiNOb3Qgc3VyZSB3aHkgSSBrZWVwIHRoaXMgaW4NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCg0KI0xvYWQgZGF0YQ0Kc3BweHNpdGVzPC1yZWFkLmNzdigiZGF0YS9WRUdEQVRBRE9ORS5jc3YiLCBoZWFkZXI9VFJVRSkNCnNpdGVuYW1lczwtcmVhZC5jc3YoImRhdGEvU2l0ZU5hbWVzLmNzdiIsIGhlYWRlcj1UUlVFKQ0Kc2l0ZXNpemVzPC1yZWFkLmNzdigiZGF0YS9TaXRlWHNpemUyLmNzdiIsIGhlYWRlcj1UUlVFKQ0KcXVhZGRhdGFzPC1yZWFkLmNzdigiZGF0YS9xdWFkbWV0cmljcy5jc3YiLCBoZWFkZXI9VFJVRSkNCmNvbG5hbWVzKHF1YWRkYXRhcylbY29sbmFtZXMocXVhZGRhdGFzKT09IkRlcHRoLi5tLiJdIDwtICJEZXB0aCINCmNvbG5hbWVzKHF1YWRkYXRhcylbY29sbmFtZXMocXVhZGRhdGFzKT09IlguLkNhbm9weSJdIDwtICJDYW5vcHkiDQpjb2xuYW1lcyhxdWFkZGF0YXMpW2NvbG5hbWVzKHF1YWRkYXRhcyk9PSJQb25kIl0gPC0gIlNpdGUiDQojTm90ZTogdGhlcmUgaXMgbm8gU2l0ZSAxNTsgaXQgd2FzIGRpdGNoZWQgaGFsZndheSB0aHJvdWdoIHNhbXBsaW5nIGJlY2F1c2UgaXQgd2FzIG5vdCBpbmRlcGVuZGVudCBmcm9tIFNpdGUgMTQuDQpgYGANCg0KIyMgQmFja2dyb3VuZCANCg0KPGZpZ3VyZT4NCjxpbWcgc3JjPSJJbWFnZXMvUXVhZHJhdENyb3BwZWQuanBnIj48L2ZpZ3VyZT48YnI+DQoNCiMjIyBEYXRhIENvbGxlY3Rpb24NCg0KIyMjIERhdGEgQ29uZmlndXJhdGlvbg0KDQpXZSBoYXZlIHNwZWNpZXMgY29tcG9zaXRpb24gZGF0YSBmcm9tIDEwMzEgMW1eMiBxdWFkcmF0cyByZXByZXNlbnRpbmcgMjcgc2l0ZXMuDQoNCk5lYXJseSBhbGwgc3RhdGlzdGljYWwgcGFja2FnZXMgcmVxdWlyZSB0aGUgZGF0YSB0byBiZSBpbiBhIHByZXNlbmNlLWFic2VuY2UgZm9ybS4gVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBkbyBpdCAob25lIG9mIHdoaWNoIGNhbiBtYWludGFpbiBjb3ZlciB2YWx1ZXMgcmF0aGVyIHRoYW4gY2hhbmdpbmcgaXQgdG8gYmluYXJ5IGRhdGEpOyBJIHVzZWQgYSBsb29wIGZ1bmN0aW9uLiBUaGUgcmVzdWx0IGlzIGEgcHJlc2VuY2UtYWJzZW5jZSBtYXRyaXggd2l0aCBTaXRlIGFzIGEgY29sdW1uIHNvIHN1YnNhbXBsZXMgY2FuIGJlIG9yZ2FuaXplZCBhY2NvcmRpbmdseS4gVGhpcyBjb2x1bW4gbXVzdCBiZSBkZWxldGVkIGZvciBldmVyeSBhbmFseXNpcywgaG93ZXZlciENCg0KYGBge3IgTG9vcCBtYWdpYywgY2FjaGU9VFJVRSwgaW5jbHVkZT1GQUxTRX0NCnNpdGVzX3N1YjwtdW5pcXVlKHNwcHhzaXRlcyRJRCkNCnNwcF9zdWI8LXVuaXF1ZShzcHB4c2l0ZXMkU3BlY2llcykNCg0KI01ha2UgYSBtYXRyaXggd2l0aCBsb29wIGZ1bmN0aW9uDQpzcHBfY29tbWF0IDwtIG1hdHJpeCgwLCBsZW5ndGgoc2l0ZXNfc3ViKSwgbGVuZ3RoKHNwcF9zdWIpKQ0KZm9yIChpIGluIDE6bnJvdyhzcHBfY29tbWF0KSl7dGVtcF9zaXRlcyA8LSBzcHB4c2l0ZXNbd2hpY2goc3BweHNpdGVzJElEID09IHNpdGVzX3N1YltpXSksXQ0KICBzcHBfY29tbWF0W2ksIHdoaWNoKHNwcF9zdWIlaW4ldGVtcF9zaXRlcyRTcGVjaWVzKV08LSAxDQogIHByaW50KGkpfQ0KDQojTmFtZSByb3dzIGFuZCBDb2x1bW5zDQpyb3duYW1lcyhzcHBfY29tbWF0KSA8LSBhcy5jaGFyYWN0ZXIoc2l0ZXNfc3ViKQ0KY29sbmFtZXMoc3BwX2NvbW1hdCkgPC0gYXMuY2hhcmFjdGVyKHNwcF9zdWIpDQoNCiNDaGFuZ2UgbWF0cml4IGludG8gZGF0YWZyYW1lDQpzcHBfY29tbWF0LmRmPC0gYXMuZGF0YS5mcmFtZShzcHBfY29tbWF0KQ0KDQojTWFrZSBlbXB0eSBxdWFkcmF0cyB0cnVseSBlbXB0eQ0Kc3BwX2NvbW1hdC5kZi5maXhlZDwtc3Vic2V0KHNwcF9jb21tYXQuZGYsIHNlbGVjdD0tYyhFbXB0eSkpDQoNCiNBZGQgc2l0ZSBjb2x1bW4gYmFjayBpbiBhbmQgY2hhbmdlIGl0cyBuYW1lDQpBbGxQb25kcyA8LSBjYmluZChzaXRlbmFtZXMkUG9uZCxzcHBfY29tbWF0LmRmLmZpeGVkKQ0KbmFtZXMoQWxsUG9uZHMpW25hbWVzKEFsbFBvbmRzKT09InNpdGVuYW1lcyRQb25kIl0gPC0gIlNpdGUiDQpgYGANCg0KYGBge3IgS2FibGUgMSwgZWNobz1GQUxTRX0NCkFsbFBvbmRzVHJpbW1lZDwtc2VsZWN0KEFsbFBvbmRzLCBjKDE6NykpDQprYWJsZShBbGxQb25kc1RyaW1tZWRbMTo1LCBdLCBmb3JtYXQgPSAicGFuZG9jIiwgZnVsbF93aWR0aD1GLCBjYXB0aW9uID0gJ1RhYmxlIDEuIFNhbXBsZSBvZiBkYXRhIGluIHByZXNlbmNlLWFic2VuY2UgZm9ybWF0LicpDQpgYGANCg0KDQojIyBEaXZlcnNpdHkgRXN0aW1hdGVzDQoNCmBgYHtyIFNwbGl0IHNpdGVzLCBpbmNsdWRlPUZBTFNFfQ0KI0JyZWFrIHVwIEFsbFBvbmRzIGludG8gZGF0YWZyYW1lcyBieSBzaXRlDQojVGhlIGZpcnN0IGNvbHVtbiBoYXMgdG8gYmUgcmVtb3ZlZCBmb3IgZWFjaA0KI1RyYW5zcG9zZSB0aGUgZGF0YWZyYW1lcyBzbyBzcGVjaWVzIGFyZSBjb2x1bW5zDQoNClMwMTwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDEpLCAtMSkpDQpTMDI8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyKSwgLTEpKQ0KUzAzPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMyksIC0xKSkNClMwNDwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDQpLCAtMSkpDQpTMDU8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSA1KSwgLTEpKQ0KUzA2PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gNiksIC0xKSkNClMwNzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDcpLCAtMSkpDQpTMDg8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSA4KSwgLTEpKQ0KUzA5PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gOSksIC0xKSkNClMxMDwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDEwKSwgLTEpKQ0KUzExPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTEpLCAtMSkpDQpTMTI8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxMiksIC0xKSkNClMxMzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDEzKSwgLTEpKQ0KUzE0PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTQpLCAtMSkpDQpTMTY8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxNiksIC0xKSkNClMxNzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDE3KSwgLTEpKQ0KUzE4PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTgpLCAtMSkpDQpTMTk8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxOSksIC0xKSkNClMyMDwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDIwKSwgLTEpKQ0KUzIxPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjEpLCAtMSkpDQpTMjI8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyMiksIC0xKSkNClMyMzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDIzKSwgLTEpKQ0KUzI0PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjQpLCAtMSkpDQpTMjU8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyNSksIC0xKSkNClMyNjwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDI2KSwgLTEpKQ0KUzI3PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjcpLCAtMSkpDQpTMjg8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyOCksIC0xKSkNCmBgYA0KDQpgYGB7ciBVbmljb3JuIHZvbWl0IHByZXAsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KI01ha2UgYSBsaXN0IG9mIGFsbCBzaXRlIGRhdGFmcmFtZXMNCnNpdGUubGlzdC5hbGwgPSBsaXN0KFMwMT1TMDEsUzAyPVMwMixTMDM9UzAzLFMwND1TMDQsUzA1PVMwNSxTMDY9UzA2LFMwNz1TMDcsUzA4PVMwOCxTMDk9UzA5LFMxMD1TMTAsUzExPVMxMSxTMTI9UzEyLFMxMz1TMTMsUzE0PVMxNCxTMTY9UzE2LFMxNz1TMTcsUzE4PVMxOCxTMTk9UzE5LFMyMD1TMjAsUzIxPVMyMSxTMjI9UzIyLFMyMz1TMjMsUzI0PVMyNCxTMjU9UzI1LFMyNj1TMjYsUzI3PVMyNyxTMjg9UzI4KQ0KI0NvbnZlcnQgZXZlcnl0aGluZyBpbiBsaXN0IHRvIGluY2lkZW5jZSBmcmVxdWVuY2llcw0Kc2l0ZS5saXN0LmZyZXEuYWxsID0gbGFwcGx5KHNpdGUubGlzdC5hbGwsIGFzLmluY2ZyZXEpDQpgYGANCg0KYGBge3IgVW5pY29ybiB2b21pdCBwcmVwMiwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpvdXQuaW5jLmFsbDwtaU5FWFQoc2l0ZS5saXN0LmZyZXEuYWxsLCBxPTAsIGRhdGF0eXBlPSJpbmNpZGVuY2VfZnJlcSIsIG5ib290PTEwMDAwKQ0KYGBgDQoNCmBgYHtyIEthYmxlIDIsIGluY2x1ZGU9RkFMU0V9DQojVGhlIGlORVhUIG91dHB1dCAoIm91dC5pbmMuYWxsIikgY29udGFpbnMgdGhyZWUgdGFibGVzOyAiQXN5RXN0IiBoYXMgYWxsIHRoZSBkYXRhIHdlIG5lZWQNCiNTYXZlZCBpdCBhcyBhbiBvYmplY3QgYW5kIGNoYW5nZWQgaXQgc28gaXQgd291bGQgYmUgbW9yZSByZWFkYWJsZQ0KUmljaERpdjwtb3V0LmluYy5hbGwkQXN5RXN0DQpSaWNoRGl2VDwtc3Vic2V0KFJpY2hEaXYsIHNlbGVjdD0tYyhzLmUuLCBMQ0wsIFVDTCkpDQpSaWNoRGl2T2JzPC1zdWJzZXQoc3ByZWFkKFJpY2hEaXZULCBEaXZlcnNpdHksIE9ic2VydmVkKSwgc2VsZWN0PS1jKEVzdGltYXRvcikpDQpSaWNoRGl2RXN0PC1zdWJzZXQoc3ByZWFkKFJpY2hEaXZULCBEaXZlcnNpdHksIEVzdGltYXRvciksIHNlbGVjdD0tYyhPYnNlcnZlZCkpDQoNCiNUcmltIGRvd24gY29sdW1uIG5hbWVzIHNvIHRoZXkgZG9uJ3Qgc3Vjaw0KbmFtZXMoUmljaERpdk9icyk8LWMoIlNpdGUiLCAiUmljaG5lc3NPYnMiLCAiU2hhbm5vbk9icyIsICJTaW1wc29uT2JzIikNCm5hbWVzKFJpY2hEaXZFc3QpPC1jKCJTaXRlIiwgIlJpY2huZXNzRXhwIiwgIlNoYW5ub25FeHAiLCAiU2ltcHNvbkV4cCIpDQoNCiNDb2xsYXBzZSBzaXRlczsgaGF2ZSB0byBkbyBmdW5reSB0aGluZ3MgdG8gZGVhbCB3aXRoIE5Bcw0KY29tcHJlc3MgPC0gZnVuY3Rpb24oeCkgYyhuYS5vbWl0KHgpLCBOQSlbMV0NClJpY2hEaXZPYnMuMTwtYWdncmVnYXRlKFJpY2hEaXZPYnNbMjo0XSwgUmljaERpdk9ic1sxXSwgY29tcHJlc3MpDQpSaWNoRGl2RXN0LjE8LWFnZ3JlZ2F0ZShSaWNoRGl2RXN0WzI6NF0sIFJpY2hEaXZFc3RbMV0sIGNvbXByZXNzKQ0KDQojUmVtb3ZlIHNpdGUgY29sdW1uIGZyb20gUmljaERpdkVzdCBzbyBpdCdzIG5vdCBkdXBsaWNhdGVkIHdoZW4gbWVyZ2luZw0KUmljaERpdkVzdC4yPC1zdWJzZXQoUmljaERpdkVzdC4xLCBzZWxlY3Q9LWMoU2l0ZSkpDQoNCiNNZXJnZSBldmVyeWJvZHkgdG9nZXRoZXINClJpY2hEaXZGaW5hbDwtY2JpbmQoUmljaERpdk9icy4xLCBSaWNoRGl2RXN0LjIpDQoNCiNSZW9yZGVyIGNvbHVtbnMgc28gdGhleSBtYWtlIHNlbnNlDQpSaWNoRGl2VGFiPC1SaWNoRGl2RmluYWxbLGMoMSwyLDUsMyw2LDQsNyldDQpSaWNoRGl2S2FiPC1SaWNoRGl2VGFiW2MoMSwgNiwgNywgOCwgMTAsIDI2LCAyNyksXQ0KDQprYWJsZShSaWNoRGl2S2FiWzE6NyxdLCBmb3JtYXQgPSAicGFuZG9jIiwgZnVsbF93aWR0aD1GLCBjYXB0aW9uID0gJ1RhYmxlIDIuIE9ic2VydmVkIGFuZCBleHBlY3RlZCBIaWxsIG51bWJlcnMgZnJvbSBhIHBvcnRpb24gb2YgdGhlIHNpdGVzLicpDQpgYGANCg0KYGBge3IgRXN0IGFuZCBPYnMgUmljaG5lc3MsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KUmljaG5lc3NPbmx5PC1maWx0ZXIoUmljaERpdiwgRGl2ZXJzaXR5ID09ICJTcGVjaWVzIHJpY2huZXNzIikNCmNvbG5hbWVzKFJpY2huZXNzT25seSlbY29sbmFtZXMoUmljaG5lc3NPbmx5KT09IkxDTCJdIDwtICJSaWNoTENMIg0KY29sbmFtZXMoUmljaG5lc3NPbmx5KVtjb2xuYW1lcyhSaWNobmVzc09ubHkpPT0iVUNMIl0gPC0gIlJpY2hVQ0wiDQpjb2xuYW1lcyhSaWNobmVzc09ubHkpW2NvbG5hbWVzKFJpY2huZXNzT25seSk9PSJFc3RpbWF0b3IiXSA8LSAiRXN0aW1hdGVkIg0KUmljaEdhdGg8LWdhdGhlcihSaWNobmVzc09ubHksUmljaG5lc3MsdmFsdWUsT2JzZXJ2ZWQ6RXN0aW1hdGVkKQ0KUmljaFNpemU8LSBjYmluZChSaWNoR2F0aCwgc2l0ZXNpemVzJFF1YWRyYXRzKQ0KY29sbmFtZXMoUmljaFNpemUpW2NvbG5hbWVzKFJpY2hTaXplKT09InNpdGVzaXplcyRRdWFkcmF0cyJdIDwtICJRdWFkcmF0cyINCg0KDQpnZ3Bsb3QoUmljaEdhdGgsIGFlcyh4PVNpdGUsIHk9dmFsdWUsIGNvbG9yPVJpY2huZXNzKSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImRhcmtncmV5IiwgImJsYWNrIikpKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVJpY2hMQ0wsIHltYXg9UmljaFVDTCksIHdpZHRoPS4zLCBjb2xvcj0iZGFya2dyZXkiKSArDQogIGdlb21fcG9pbnQoc2l6ZT0yKSsNCiAgeWxhYigiU3BlY2llcyBSaWNobmVzcyIpKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMjUwKSkrDQogIGdndGl0bGUoIkVzdGltYXRlZCBhbmQgb2JzZXJ2ZWQgc3BlY2llcyByaWNobmVzcyBieSBzaXRlLCB3aXRoIDk1JSBjb25maWRlbmNlIGludGVydmFscy4iKSsNCiAgbGFicyhjYXB0aW9uPSJOb3RlIHRoYXQgdXBwZXIgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgU2l0ZSAyNiBleHRlbmRzIHRvIDI2Mi44IGFuZCBTaXRlIDEwIGV4dGVuZHMgdG8gNDA4LjUyLiIpKw0KICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSkNCmBgYA0KDQpTaXRlcyBoYWQgd2lkZWx5IHZhcnlpbmcgb2JzZXJ2ZWQgdG90YWwgcmljaG5lc3MuIFRoZSB1c2Ugb2YgZXh0cmFwb2xhdGVkIHNwZWNpZXMgYWNjdW11bGF0aW9uIGN1cnZlcyBjYW4gdGVsbCB1cyBob3cgbWFueSBzcGVjaWVzIGFyZSBsaWtlbHkgdG8gYmUgYXQgdGhlIHNpdGUgYmFzZWQgb24gaG93IG1hbnkgd2VyZSBmb3VuZCBpbiBhY2N1bXVsYXRpbmcgc3Vic2FtcGxlcy4gSG93ZXZlciBpZiBhIGN1cnZlIG5ldmVyIGZsYXR0ZW5zLCBpdCBnaXZlcyBhIHdpbGQgZXN0aW1hdGUgb2YgcmljaG5lc3MgKHNlZSBTaXRlIDEwKS4NCg0KV2hhdCBkbyB0aGUgY3VydmVzIHRoYXQgbWFkZSB0aGVzZSBlc3RpbWF0ZXMgbG9vayBsaWtlPyBMZXQncyB0YWtlIGEgbG9vayENCg0KYGBge3IgVW5pY29ybiB2b21pdCwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPVRSVUV9DQpnZ2lORVhUKG91dC5pbmMuYWxsLCB0eXBlPTEsIGNvbG9yLnZhcj0ic2l0ZSIpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSArDQogIHhsYWIoIk51bWJlciBvZiBRdWFkcmF0cyIpICsNCiAgZ2d0aXRsZSgiSW50ZXJwb2xhdGVkIGFuZCBleHRyYXBvbGF0ZWQgcmljaG5lc3MiKSArDQogIGxhYnMoY2FwdGlvbj0iQj0xMDAwMC4iKQ0KYGBgDQoNClRoaXMgcGxvdCBpcyBub3QgcGFydGljdWxhcmx5IGhlbHBmdWwgb3RoZXIgdGhhbiB0byB2aXN1YWxpemUgdGhlIGdlbmVyYWwgc3BhbiBvZiBvYnNlcnZlZCBhbmQgZXhwZWN0ZWQgcmljaG5lc3NlcyBhbmQgc2FtcGxpbmcgZWZmb3J0cy4gRXhhbWluaW5nIHRoZSBjdXJ2ZXMgaW4gcG9ydGlvbnMgb2YgMy00IGlzIG5lY2Vzc2FyeSB0byANCg0KYGBge3IgU21hbGxlciBjdXJ2ZXMgMSwgaW5jbHVkZT1GQUxTRX0NCiNMaXN0IHRoZSBkYXRhZnJhbWVzLCB0aGVuIGNvbnZlcnQgdGhlbSBpbnRvIGluY2lkZW5jZSBmcmVxdWVuY2llcw0KI0kgYnJva2UgdGhlbSBpbnRvIG1hbmFnZWFibGUgY2h1bmtzIHRoYXQgZ3JhcGggbW9yZSBjbGVhcmx5IHRoYW4gZXZlcnl0aGluZyBhdCBvbmNlDQoNCnNpdGUubGlzdC4xID0gbGlzdChTMDM9UzAzLCBTMDg9UzA4LCAgUzA5PVMwOSwgUzI4PVMyOCkNCnNpdGUubGlzdC5mcmVxLjEgPSBsYXBwbHkoc2l0ZS5saXN0LjEsIGFzLmluY2ZyZXEpDQoNCnNpdGUubGlzdC4yID0gbGlzdChTMDE9UzAxLCBTMDI9UzAyLCAgUzExPVMxMSwgUzI3PVMyNykNCnNpdGUubGlzdC5mcmVxLjIgPSBsYXBwbHkoc2l0ZS5saXN0LjIsIGFzLmluY2ZyZXEpDQoNCnNpdGUubGlzdC4zID0gbGlzdChTMTA9UzEwLCBTMTM9UzEzLCBTMTQ9UzE0LCBTMjM9UzIzKQ0Kc2l0ZS5saXN0LmZyZXEuMyA9IGxhcHBseShzaXRlLmxpc3QuMywgYXMuaW5jZnJlcSkNCg0KDQpzaXRlLmxpc3QuNCA9IGxpc3QoUzA1PVMwNSxTMTI9UzEyLCBTMTc9UzE3KQ0Kc2l0ZS5saXN0LmZyZXEuNCA9IGxhcHBseShzaXRlLmxpc3QuNCwgYXMuaW5jZnJlcSkNCg0Kc2l0ZS5saXN0LjUgPSBsaXN0KCBTMTk9UzE5LCBTMjA9UzIwLCBTMjE9UzIxLCBTMjU9UzI1KQ0Kc2l0ZS5saXN0LmZyZXEuNSA9IGxhcHBseShzaXRlLmxpc3QuNSwgYXMuaW5jZnJlcSkNCg0Kc2l0ZS5saXN0LjYgPSBsaXN0KFMwNj1TMDYsIFMxNj1TMTYsIFMyMj1TMjIsIFMyNj1TMjYpDQpzaXRlLmxpc3QuZnJlcS42ID0gbGFwcGx5KHNpdGUubGlzdC42LCBhcy5pbmNmcmVxKQ0KDQpzaXRlLmxpc3QuNyA9IGxpc3QoUzA0PVMwNCwgUzA3PVMwNywgUzE4PVMxOCwgUzI0PVMyNCkNCnNpdGUubGlzdC5mcmVxLjcgPSBsYXBwbHkoc2l0ZS5saXN0LjcsIGFzLmluY2ZyZXEpDQpgYGANCg0KYGBge3IgU21hbGxlciBjdXJ2ZXMgMiwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9NywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY2FjaGU9VFJVRX0NCiNSaWNobmVzcyAocT0wKSwgU2hhbm5vbiBEaXYgKHE9MSksIFNpbXBzb24gRGl2IChxPTIpDQojVXNlIGdyZXk9VFJVRSB0byBtYWtlIGFsbCBsaW5lcyBibGFjaw0Kb3V0LmluYzE8LWlORVhUKHNpdGUubGlzdC5mcmVxLjEsIHE9MCwgZGF0YXR5cGU9ImluY2lkZW5jZV9mcmVxIiwgc2l6ZT1OVUxMLCBuYm9vdD0xMDApDQpBPC1nZ2lORVhUKG91dC5pbmMxLCB0eXBlPTEsIGNvbG9yLnZhcj0ic2l0ZSIpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSArDQogIHhsYWIoIk51bWJlciBvZiBRdWFkcmF0cyIpICsNCiAgbGFicyhjYXB0aW9uPSJCPTEwMC4iKQ0KDQpvdXQuaW5jMjwtaU5FWFQoc2l0ZS5saXN0LmZyZXEuMiwgcT0wLCBkYXRhdHlwZT0iaW5jaWRlbmNlX2ZyZXEiLCBzaXplPU5VTEwsIG5ib290PTEwMCkNCkI8LWdnaU5FWFQob3V0LmluYzIsIHR5cGU9MSwgY29sb3IudmFyPSJzaXRlIikgKyANCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTgpICsNCiAgeWxhYigiU3BlY2llcyBSaWNobmVzcyIpICsNCiAgeGxhYigiTnVtYmVyIG9mIFF1YWRyYXRzIikgKw0KICBsYWJzKGNhcHRpb249IkI9MTAwLiIpDQoNCm91dC5pbmMzPC1pTkVYVChzaXRlLmxpc3QuZnJlcS4zLCBxPTAsIGRhdGF0eXBlPSJpbmNpZGVuY2VfZnJlcSIsIHNpemU9TlVMTCwgbmJvb3Q9MTAwKQ0KQzwtZ2dpTkVYVChvdXQuaW5jMywgdHlwZT0xLCBjb2xvci52YXI9InNpdGUiKSArIA0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxOCkgKw0KICB5bGFiKCJTcGVjaWVzIFJpY2huZXNzIikgKw0KICB4bGFiKCJOdW1iZXIgb2YgUXVhZHJhdHMiKSArDQogIGxhYnMoY2FwdGlvbj0iQj0xMDAuIikNCg0Kb3V0LmluYzQ8LWlORVhUKHNpdGUubGlzdC5mcmVxLjQsIHE9MCwgZGF0YXR5cGU9ImluY2lkZW5jZV9mcmVxIiwgc2l6ZT1OVUxMLCBuYm9vdD0xMDApDQpEPC1nZ2lORVhUKG91dC5pbmM0LCB0eXBlPTEsIGNvbG9yLnZhcj0ic2l0ZSIpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSArDQogIHhsYWIoIk51bWJlciBvZiBRdWFkcmF0cyIpICsNCiAgbGFicyhjYXB0aW9uPSJCPTEwMC4iKQ0KDQpvdXQuaW5jNTwtaU5FWFQoc2l0ZS5saXN0LmZyZXEuNSwgcT0wLCBkYXRhdHlwZT0iaW5jaWRlbmNlX2ZyZXEiLCBzaXplPU5VTEwsIG5ib290PTEwMCkNCkU8LWdnaU5FWFQob3V0LmluYzUsIHR5cGU9MSwgY29sb3IudmFyPSJzaXRlIikgKyANCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTgpICsNCiAgeWxhYigiU3BlY2llcyBSaWNobmVzcyIpICsNCiAgeGxhYigiTnVtYmVyIG9mIFF1YWRyYXRzIikgKw0KICBsYWJzKGNhcHRpb249IkI9MTAwLiIpDQoNCm91dC5pbmM2PC1pTkVYVChzaXRlLmxpc3QuZnJlcS42LCBxPTAsIGRhdGF0eXBlPSJpbmNpZGVuY2VfZnJlcSIsIHNpemU9TlVMTCwgbmJvb3Q9MTAwKQ0KRjwtZ2dpTkVYVChvdXQuaW5jNiwgdHlwZT0xLCBjb2xvci52YXI9InNpdGUiKSArIA0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxOCkgKw0KICB5bGFiKCJTcGVjaWVzIFJpY2huZXNzIikgKw0KICB4bGFiKCJOdW1iZXIgb2YgUXVhZHJhdHMiKSArDQogIGxhYnMoY2FwdGlvbj0iQj0xMDAuIikNCg0Kb3V0LmluYzc8LWlORVhUKHNpdGUubGlzdC5mcmVxLjcsIHE9MCwgZGF0YXR5cGU9ImluY2lkZW5jZV9mcmVxIiwgc2l6ZT1OVUxMLCBuYm9vdD0xMDApDQpHPC1nZ2lORVhUKG91dC5pbmM3LCB0eXBlPTEsIGNvbG9yLnZhcj0ic2l0ZSIpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSArDQogIHhsYWIoIk51bWJlciBvZiBRdWFkcmF0cyIpICsNCiAgbGFicyhjYXB0aW9uPSJCPTEwMC4iKQ0KYGBgDQoNCmBgYHtyIE1hbnkgY3VydmVzIG91dHB1dCwgZmlnLmhlaWdodD0yNSwgZmlnLndpZHRoPTcsIGluY2x1ZGU9RkFMU0V9DQpnZ2FycmFuZ2UoQSwgQiwgQywgRCwgRSwgRiwgRywgbnJvdz03KQ0KYGBgDQogDQpgYGB7ciBEYXRhIHJlYXJyYW5naW5nLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCkludGVydmFsczwtc2VsZWN0KHNsaWNlKFJpY2hHYXRoLCBjKDI4OjU0KSksIGMoUmljaExDTCwgUmljaFVDTCkpDQpSaWNoSW50czwtY2JpbmQoUmljaERpdlRhYiwgSW50ZXJ2YWxzKQ0KUmljaEludHMkUGVyY0NvbXBsZXRlIDwtIFJpY2hJbnRzJFJpY2huZXNzT2JzL1JpY2hJbnRzJFJpY2huZXNzRXhwKjEwMA0KUmljaEludHMkUGVyY0NvbXBsZXRlVTwtIFJpY2hJbnRzJFJpY2huZXNzT2JzL1JpY2hJbnRzJFJpY2hVQ0wqMTAwDQpSaWNoSW50cyRQZXJjQ29tcGxldGVMPC0gUmljaEludHMkUmljaG5lc3NPYnMvUmljaEludHMkUmljaExDTCoxMDANCnNpdGVzaXplcyRRdWFkc0FyZWE8LSBzaXRlc2l6ZXMkUXVhZHJhdHMvKHBpKihzaXRlc2l6ZXMkTGVuZ3RoXjIpKQ0Kc2l0ZXNpemVzJEFyZWE8LShwaSooc2l0ZXNpemVzJExlbmd0aF4yKSkNCiMgDQojIFRISVMgUExPVCBJUyBUUkFTSA0KIyBnZ3Bsb3QoUmljaEludHMsIGFlcyh4PVNpdGUsIHk9UGVyY0NvbXBsZXRlKSkgKw0KIyAgIGdlb21fYmFyKGFlcyh5PXNpdGVzaXplcyRRdWFkcmF0cyx4PVNpdGUpLCBzdGF0PSJpZGVudGl0eSIsIHdpZHRoID0gMC43NSwgZmlsbD0ibGlnaHRncmV5IikrDQojICAgZ2VvbV9wb2ludChzaXplPTIpKw0KIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49UGVyY0NvbXBsZXRlTCwgeW1heD1QZXJjQ29tcGxldGVVKSwgd2lkdGg9LjMpICsNCiMgICB5bGFiKCJPYnNlcnZlZC9FeHBlY3RlZCBSaWNobmVzcyAqIDEwMCIpKw0KIyAgIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4uLCBuYW1lID0gIlF1YWRyYXRzIFNhbXBsZWQiKSkrDQojICAgZ2d0aXRsZSgiQ29tcGxldGlvbiBwZXJjZW50YWdlIGFuZCBzYW1wbGUgc2l6ZSBwZXIgc2l0ZSIpKw0KIyAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpKQ0KYGBgDQoNCmBgYHtyIExNIFNhbXBsaW5nIHN1ZmZpY2llbmN5LCBpbmNsdWRlPUZBTFNFfQ0KbG1SaWNoUXVhZCA8LSBsbShSaWNoSW50cyRQZXJjQ29tcGxldGUgfiBzaXRlc2l6ZXMkUXVhZHNBcmVhKQ0KYXV0b3Bsb3QobG1SaWNoUXVhZCkNCmFSaWNoUXVhZDwtYW5vdmEobG1SaWNoUXVhZCkNCmFSaWNoUXVhZA0KYGBgDQoNClRoZXNlIGN1cnZlcyBpbGx1c3RyYXRlIG5vdCBvbmx5ICp3aGVyZSogdGhlIGZsYXR0ZW5pbmcgcG9pbnQgKGV4cGVjdGVkIHJpY2huZXNzKSBvY2N1cnMsIGJ1dCBhbHNvICpob3cgcXVpY2tseSouIEV4YW1pbmluZyBhIGN1cnZlIGNhbiBhbGxvdyBzb21lb25lIHRvIGVzdGltYXRlIGhvdyBtYW55IG1vcmUgc2FtcGxlcyB3b3VsZCBiZSBuZWVkZWQgdG8gcmVhY2ggdGhhdCBwb2ludCwgaG93ZXZlciBpZiBkb2luZyBzbyBzYW1wbGVzIGEgbGFyZ2VyIGFyZWEgdGhlbiB0aGUgY3VydmUgbWF5IG5ldmVyIGZsYXR0ZW4uIA0KDQpMZXQncyBzZWUgaWYgc2FtcGxpbmcgZWZmb3J0ICgjIHF1YWRyYXRzL2FyZWEgc2FtcGxlZCkgYWZmZWN0ZWQgcGVyY2VudCBlc3RpbWF0ZWQgc2FtcGxpbmcgY29tcGxldGlvbjsgaWYgaXQgZGlkLCB0aGF0IHdvdWxkIGJlIGEgYmlnIHByb2JsZW0gYW5kIEkgd291bGQgaGF2ZSBhIGxvdCBvZiBleHBsYWluaW5nIHRvIGRvIHRvIG15IGNvbW1pdHRlZS4NCg0KYGBge3IgU2FtcGxpbmcgc3VmZmljaWVuY3ksIGVjaG89RkFMU0V9DQpnZ3Bsb3QoUmljaEludHMsIGFlcyh4PXNpdGVzaXplcyRRdWFkc0FyZWEsIHk9UGVyY0NvbXBsZXRlLCBjb2xvcj0iYmxhY2siKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgY29sb3I9ImJsYWNrIikrDQogIGdlb21fdGV4dChsYWJlbD1SaWNoSW50cyRTaXRlLCBjb2xvcj0iYmxhY2siLCBzaXplPTMpKw0KICB5bGFiKCJFc3RpbWF0ZWQgJSBTcGVjaWVzIFNhbXBsZWQiKSsNCiAgeGxhYihleHByZXNzaW9uKFF1YWRyYXRzflNhbXBsZWQvU2l0ZX5BcmVhfihtXjIpKSkrDQogIGdndGl0bGUoIkVzdGltYXRlZCBzYW1wbGluZyBjb21wbGV0aW9uIGRvZXMgbm90IGluY3JlYXNlIHdpdGggc2FtcGxpbmcgZWZmb3J0IikrDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxMDApKSsNCiAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCkpDQpgYGANCg0KVGhlcmUgaXMgbm8gcmVsYXRpb25zaGlwIGJldHdlZW4gc2FtcGxpbmcgZWZmb3J0IGFuZCBjb21wbGV0aW9uIHBlcmNlbnRhZ2UgKHA9YHIgYVJpY2hRdWFkWzEsNV1gKS4gSG93ZXZlciwgbm90ZSB0aGF0IFNpdGVzIDEwIGFuZCAyNiB3ZXJlIGZsYWdnZWQgYXMgb3V0bGllcnMgYnkgdGhlIGF1dG9wbG90IGZ1bmN0aW9uLiBUaGlzIGluYWRlcXVhdGUgc2FtcGxpbmcgaXMgbGlrZWx5IHRoZSByZXN1bHQgb2YgdG9vIGZldyBxdWFkcmF0cyBzYW1wbGVkIGF0IHRoZSB3ZXRsYW5kIGVkZ2UgcmVsYXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHdldGxhbmQuIA0KDQoNCg0KIyMgRWZmZWN0cyBvbiBEaXZlcnNpdHkNCg0KPGZpZ3VyZT4NCjxpbWcgc3JjPSJJbWFnZXMvR29vc2Vjcm9wcGVkLmpwZyI+PC9maWd1cmU+PGJyPg0KDQpgYGB7ciBTaXRlIHNpemUgYW5kIHJpY2huZXNzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcXVhZGRpZXM8LW1lcmdlKHNpdGVzaXplcywgUmljaEludHMsIGJ5PSJTaXRlIikNCnF1YWRkaWVzJExhdGl0dWRlIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHF1YWRkaWVzJExhdGl0dWRlKSkNCg0KZ2dwbG90KFJpY2hJbnRzLCBhZXMoeD1zaXRlc2l6ZXMkQXJlYSwgeT1SaWNoSW50cyRSaWNobmVzc09icykpICsNCiAgZ2VvbV9wb2ludChzaXplPTIpKw0KICB5bGFiKCJTaXRlIHJpY2huZXNzIikrDQogIHhsYWIoZXhwcmVzc2lvbihTaXRlfmFyZWF+KG1eMikpKSsNCiAgZ2d0aXRsZSgiU2l0ZSBhcmVhIGRvZXMgbm90IGhhdmUgYSBwb3NpdGl2ZSBhZmZlY3Qgb24gc2l0ZSByaWNobmVzcyIpKw0KICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSkNCmBgYA0KDQpUaGVyZSBhcHBlYXJzIHRvIGJlIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gc2l0ZSByaWNobmVzcyBhbmQgc2l0ZSBhcmVhLCBidXQgdW5leHBlY3RlZGx5IHRoaXMgcmVsYXRpb25zaGlwIGFwcGVhcnMgdG8gYmUgbmVnYXRpdmUuIEJlY2F1c2UgdGhlIGRhdGEgYXJlIGxpa2VseSBub24tbGluZWFyLCBhIGdlbmVyYWxpemVkIGxpbmVhciBtb2RlbCBzaG91bGQgYmUgdXNlZCB0byBhc3Nlc3MgdGhpcyByZWxhdGlvbnNoaXAuDQoNCg0KDQoNCiMjIENvbW11bml0eSBDbGFzc2lmaWNhdGlvbg0KDQpgYGB7ciBTb3JlbnNlbiB0aW1lLCBpbmNsdWRlPUZBTFNFfQ0Kc3VtMDE8LXJvd1N1bXMoUzAxKQ0Kc3VtMDI8LXJvd1N1bXMoUzAyKQ0Kc3VtMDM8LXJvd1N1bXMoUzAzKQ0Kc3VtMDQ8LXJvd1N1bXMoUzA0KQ0Kc3VtMDU8LXJvd1N1bXMoUzA1KQ0Kc3VtMDY8LXJvd1N1bXMoUzA2KQ0Kc3VtMDc8LXJvd1N1bXMoUzA3KQ0Kc3VtMDg8LXJvd1N1bXMoUzA4KQ0Kc3VtMDk8LXJvd1N1bXMoUzA5KQ0Kc3VtMTA8LXJvd1N1bXMoUzEwKQ0Kc3VtMTE8LXJvd1N1bXMoUzExKQ0Kc3VtMTI8LXJvd1N1bXMoUzEyKQ0Kc3VtMTM8LXJvd1N1bXMoUzEzKQ0Kc3VtMTQ8LXJvd1N1bXMoUzE0KQ0Kc3VtMTY8LXJvd1N1bXMoUzE2KQ0Kc3VtMTc8LXJvd1N1bXMoUzE3KQ0Kc3VtMTg8LXJvd1N1bXMoUzE4KQ0Kc3VtMTk8LXJvd1N1bXMoUzE5KQ0Kc3VtMjA8LXJvd1N1bXMoUzIwKQ0Kc3VtMjE8LXJvd1N1bXMoUzIxKQ0Kc3VtMjI8LXJvd1N1bXMoUzIyKQ0Kc3VtMjM8LXJvd1N1bXMoUzIzKQ0Kc3VtMjQ8LXJvd1N1bXMoUzI0KQ0Kc3VtMjU8LXJvd1N1bXMoUzI1KQ0Kc3VtMjY8LXJvd1N1bXMoUzI2KQ0Kc3VtMjc8LXJvd1N1bXMoUzI3KQ0Kc3VtMjg8LXJvd1N1bXMoUzI4KQ0KDQpzdW1tYXJ5PC1hcy5kYXRhLmZyYW1lKHJiaW5kKHN1bTAxLCBzdW0wMiwgc3VtMDMsIHN1bTA0LCBzdW0wNSwgc3VtMDYsIHN1bTA3LCBzdW0wOCwgc3VtMDksIHN1bTEwLCBzdW0xMSwgc3VtMTIsIHN1bTEzLCBzdW0xNCwgc3VtMTYsIHN1bTE3LCBzdW0xOCwgc3VtMTksIHN1bTIwLCBzdW0yMSwgc3VtMjIsIHN1bTIzLCBzdW0yNCwgc3VtMjUsIHN1bTI2LCBzdW0yNywgc3VtMjgpKQ0KI1RPIERFTEVURSBTSU5HTEVUT05TDQpzdW1zdW1zPC1yYmluZChzdW1zLCBzdW1tYXJ5KQ0Kcm93bmFtZXMoc3Vtc3VtcylbMV08LSJzdW0iDQpzdW1zdW1zMSA9IHN1bXN1bXNbLHN1bXMgPiAxXQ0KbmNvbChzdW1zdW1zWyxzdW1zID09IDFdKQ0KIzIzNSoqIHNpbmdsZXRvbnMhDQoNCiNDb252ZXJ0IHRvIGJpbmFyeQ0Kc3Vtc3VtczFbc3Vtc3VtczEgPiAwXSA8LSAxDQoNCnN1bXN1bXMyPC1zbGljZShzdW1zdW1zMSwgLWMoMSkpDQoNCiMwPWlkZW50aWNhbCwgMT10aGUgbW9zdCBkaXNzaW1pbGFyDQpzb3JlbnNlbjwtdmVnZGlzdChzdW1zdW1zMiwgbWV0aG9kPSJicmF5IiwgYmluYXJ5PVRSVUUsIGRpYWc9VFJVRSwgdXBwZXI9RkFMU0UsIG5hLnJtID0gRkFMU0UpDQpzb3JlbnNlbi5tPC1hcy5tYXRyaXgoc29yZW5zZW4pDQpzb3JlbnNlbi5tLnQ8LXNpZ25pZihzb3JlbnNlbi5tLCBkaWdpdHMgPSAzKQ0KYGBgDQoNCmBgYHtyIERpc3RhbmNlIE1hdHJpeCwgaW5jbHVkZT1GQUxTRX0NCnNpdGVzaXplc2dlbzwtc2VsZWN0KHNpdGVzaXplcywgYygiU2l0ZSIsICJMYXRpdHVkZSIsICJMb25naXR1ZGUiKSkNCnNpdGVzaXplc2dlby4xPC1zaXRlc2l6ZXNnZW9bLGMoMSwzLDIpXQ0Kc2l0ZXNpemVzZ2VvLjI8LXNpdGVzaXplc2dlby4xWyxjKDIsMyldDQpkaXN0YW5jZS5tPC1kaXN0bShzaXRlc2l6ZXNnZW8uMikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1RoaXMgaXMgcmVhbGx5IHNsb3BweQ0Kc29yZW5zZW5jb2w8LWFzLmRhdGEuZnJhbWUoc29yZW5zZW4ubS50KQ0KZGlzdGFuY2Vjb2w8LWFzLmRhdGEuZnJhbWUoZGlzdGFuY2UubSkNCnNvcmVuc2VubWVsdDwtbWVsdChzb3JlbnNlbmNvbCwgdmFyaWFibGUubmFtZSA9ICdTb3JlbnNlbicpDQpnZW9ncmFwaGljbWVsdDwtbWVsdChkaXN0YW5jZWNvbCwgdmFyaWFibGUubmFtZSA9ICdHZW9ncmFwaGljJykNCmRpc3RhbmNlLjE8LWNiaW5kKGdlb2dyYXBoaWNtZWx0LCBzb3JlbnNlbm1lbHQpDQpuYW1lcyhkaXN0YW5jZS4xKTwtYygiVmFyMSIsICJnZW9ncmFwaGljIiwgIlZhcjIiLCAiU29yZW5zZW4iKQ0KI1JlbW92ZSB6ZXJvJ3MgYmVjYXVzZSB0aGV5IG9jY3VyIHdod2VyZSBzaXRlcyBtYXRjaA0KZGlzdGFuY2UuZjwtZmlsdGVyKGRpc3RhbmNlLjEsIGdlb2dyYXBoaWMgPiAwKQ0KYGBgDQoNCmBgYHtyIE5NRFMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzb3JlbnNlbi5ubWRzMDEgPC0gbWV0YU1EUyhzb3JlbnNlbiwgaz0xMCkNCnNvcnN0cmVzc3Bsb3Q8LXN0cmVzc3Bsb3Qoc29yZW5zZW4ubm1kczAxKQ0KDQpjbHVzdGVyPC1oY2x1c3Qoc29yZW5zZW4sIG1ldGhvZD0iYXZlcmFnZSIpDQpncnA8LWN1dHJlZShjbHVzdGVyLDYpDQpwbG90KHNvcmVuc2VuLm5tZHMwMSwgdHlwZT0idGV4dCIpDQpvcmRpY2x1c3Rlcihzb3JlbnNlbi5ubWRzMDEsIGNsdXN0ZXIsIHBydW5lID0gNywgZGlzcGxheSA9ICJzaXRlcyIsDQogICAgICAgICB3ID0gd2VpZ2h0cyhzb3JlbnNlbi5ubWRzMDEsIGRpc3BsYXkpKQ0KIyBvcmRpZWxsaXBzZShzb3JlbnNlbi5ubWRzMDEsIGdyb3VwPWdycCwgZGlzcGxheT0ic2l0ZXMiLCBraW5kPWMoInNkIiksIGRyYXc9ImxpbmVzIiwgY29uZj0wLjk1LCBsd2Q9Mi42LCBjb2w9ImdyZXk0NCIpDQpgYGANCiMjIyBXaGljaCBzaXRlcyBhcmUgc2ltaWxhcj8NCg0KVGhlcmUgbWF5IGJlIGEgbG90IG9mIG92ZXJsYXAgaW4gY2x1c3RlcnMgZHVlIHRvIHRoZSBuZXN0ZWRuZXNzIG9mIHNvbWUgY29tbXVuaXR5IHR5cGVzLiBXZSBzaG91bGQgcmV2aXNpdCB0aGlzIGxhdGVyIHVzaW5nIHF1YWRyYXRzIGFzIHJlcGxpY2F0ZXMuDQoNCiMjIyBBcmUgc2l0ZXMgc2ltaWxhciBiZWNhdXNlIHRoZXkncmUgZ2VvZ3JhcGhpY2FsbHkgY2xvc2VyPw0KDQpgYGB7cn0NCmdncGxvdChkaXN0YW5jZS5mLCBhZXMoeD1kaXN0YW5jZS5mJGdlb2dyYXBoaWMsIHk9ZGlzdGFuY2UuZiRTb3JlbnNlbikpICsNCiAgZ2VvbV9wb2ludCgpKw0KICBnZW9tX3Ntb290aChtZXRob2Q9ImdsbSIsIG1ldGhvZC5hcmdzPWxpc3QoZmFtaWx5PSJiaW5vbWlhbCIobGluaz0ibG9naXQiKSkpKw0KICB5bGFiKCJTb3JlbnNlbiBkaXNzaW1pbGFyaXR5IGluZGV4IikrDQogIHhsYWIoIkdlb2dyYXBoaWMgZGlzdGFuY2UgKG0pIikrDQogIGdndGl0bGUoIkdlb2dyYXBoaWMgZGlzdGFuY2UgYmV0d2VlbiBzaXRlcyBoYXMgbm8gZWZmZWN0IG9uIHNwZWNpZXMgc2ltaWxhcml0eSIpKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGlzdGFuY2UuZ2xtPC1nbG0oU29yZW5zZW5+Z2VvZ3JhcGhpYywgZmFtaWx5PWJpbm9taWFsLCBkYXRhPWRpc3RhbmNlLmYpDQpzdW1tYXJ5KGRpc3RhbmNlLmdsbSkNCmBgYA0KDQpPcmRpbmF0aW9ucw0KDQojIyBJbXBsaWNhdGlvbnMNCg0KUGxhbnQgY29tbXVuaXRpZXMgYXJlbid0IHJlYWwuIFdlIGNhbiBhbGwgZ28gaG9tZSBub3cuDQo=